package com.tlx.image;

import java.io.File;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;

import com.tlx.core.util.TFileUtils;

public class ImageJoinUtils {
    public static void main(String[] args) {
        joinVerticalByDirIncludeSon("d:/0/1");
    }

    // 合并一个目录下的全部子目录
    public static void joinVerticalByDirIncludeSon(String dirPath) {

        // 先处理当前目录下图片
        joinVerticalByDir(dirPath, null);

        // 再递归
        List<String> dirList = TFileUtils.getDirList(dirPath);
        for (String sonPath : dirList) {
            joinVerticalByDirIncludeSon(sonPath);
        }
    }

    // 合并同一个目录下全部图片
    public static void joinVerticalByDir(String dir, String destImgPath) {

        List<String> fileList = TFileUtils.getImageList(dir);
        if (CollectionUtils.isEmpty(fileList)) {
            return;
        }

        // 没传文件路径，则最终文件名是文件夹的名字
        if (StringUtils.isBlank(destImgPath)) {
            String img = fileList.get(0);
            String ext = FilenameUtils.getExtension(img);
            String parentPath = new File(img).getParent();
            String parentName = new File(parentPath).getName();
            File lastFile = new File(parentPath, parentName + "." + ext);
            destImgPath = lastFile.getAbsolutePath();
        }

        // 就一个文件，名字还一样，不操作
        if (fileList.size() == 1 && fileList.contains(destImgPath)) {
            return;
        }

        // 验证有图片名称和文件夹名称一样则报错，防止误删除
        if (fileList.contains(destImgPath)) {
            throw new RuntimeException("错误：图片名称和文件夹名称一样，可能造成误删除【" + dir + "】");
        }

        joinVertical(fileList, destImgPath);

    }

    // 合并文件，最后一个文件是最终文件，合并后删除前面的小文件，文件合并后总长度不能超过60000，增加了验证
    public static void joinVertical(List<String> fileList, String destFilePath) {

        if (CollectionUtils.isEmpty(fileList)) {
            return;
        }

        // 就一个文件：重命名
        if (fileList.size() == 1 && !StringUtils.equals(fileList.get(0), destFilePath)) {
            boolean b = new File(fileList.get(0)).renameTo(new File(destFilePath));
            if (!b) {
                throw new RuntimeException("重命名错误：【src：" + fileList.get(0) + "】【dest：" + destFilePath + "】");
            }
            return;
        }

        // 验证有图片名称和文件夹名称一样则报错，防止误删除
        if (fileList.contains(destFilePath)) {
            throw new RuntimeException("错误：图片名称和文件夹名称一样，可能造成误删除【" + destFilePath + "】");
        }

        double totalHeight = 0;
        for (String srcFile : fileList) {
            totalHeight += ImageBaseUtils.getImgInfo(srcFile)[1];
        }
        // 超过60000，等比缩放
        if (totalHeight > 60000d) {
            double sca = 60000d / totalHeight;
            for (String srcFile : fileList) {
                ImageBaseUtils.resizePercent(srcFile, srcFile, sca);
            }
        }

        ImageBaseUtils.joinV(fileList, destFilePath);

        TFileUtils.deleteListQuietly(fileList);
    }
}
